﻿using System;
using System.Collections.Generic;
using System.Text;

namespace AzManADAMStore
{
    /// <summary>
    /// Clase que encapsula un Rol
    /// </summary>
    public class Role
    {
        /// <summary>
        /// Path en ADAM
        /// </summary>
        public string Path;

        /// <summary>
        /// Nombre de la operación
        /// </summary>
        public string Name;

        /// <summary>
        /// Descripción de la operación
        /// </summary>
        public string Description;

        /// <summary>
        /// Lista de grupos asignados
        /// </summary>
        public Group.GroupList Groups;

        /// <summary>
        /// Roles asociados
        /// </summary>
        public Role.RoleList Roles;

        /// <summary>
        /// Tareas asociadas
        /// </summary>
        public Task.TaskList Tasks;

        /// <summary>
        /// Operaiones asociadas a la tarea
        /// </summary>
        public Operation.OperationList Operations;



        public Role()
        {
            this.Groups = new Group.GroupList();
            this.Roles = new Role.RoleList();
            this.Tasks = new Task.TaskList();
            this.Operations = new Operation.OperationList();
        }


        /// <summary>
        /// Crea una instancia con los mismos valores
        /// </summary>
        /// <returns></returns>
        public Role Clone()
        {
            Role newRole = new Role();
            this.Copy(newRole);
            return newRole;
        }

        /// <summary>
        /// Copia los valores de la instancia actual
        /// </summary>
        /// <param name="NuevoRole">Instancia de destino</param>
        public void Copy(Role NuevoRole)
        {
            NuevoRole.Path = this.Path;
            NuevoRole.Name = this.Name;
            NuevoRole.Description = this.Description;
            if (this.Roles != null)
                NuevoRole.Roles = this.Roles.Clone();
            if (this.Groups != null)
                NuevoRole.Groups = this.Groups.Clone();
            if (this.Tasks != null)
                NuevoRole.Tasks = this.Tasks.Clone();
            if (this.Operations != null)
                NuevoRole.Operations = this.Operations.Clone();

        }


        /// <summary>
        /// Lista de operaciones
        /// </summary>
        public class RoleList : SortedDictionary<string, Role>
        {
            /// <summary>
            /// Crea una instancia con los mismos valores
            /// </summary>
            /// <returns></returns>
            public RoleList Clone()
            {
                RoleList newLista = new RoleList();
                foreach (Role actualRole in this.Values)
                    newLista.Add(actualRole.Name, actualRole.Clone());

                return newLista;
            }

        }
    }
}
